package ASAExpression;

import application.FunctionStack;
import application.Memory;
import exceptions.ExecutionException;

/**
 * Classe permettant l'affecation d'une valeur
 * dans une variable
 * @author D.romain
 * @author O.riad
 */
public class ASAEgal extends ASAExpr {

    private ASAVariable e1;
    private ASAExpr e2;

    /**
     * Constructeur
     * @param e1 nom de la variable
     * @param e2 valeur à affecter
     */
    public ASAEgal(ASAVariable e1, ASAExpr e2) {
        this.e1 = e1;
        this.e2 = e2;
    }

    /**
     * Retourne l'expression contenant 
     * le nom de la variable
     * @return ASAExpr contenant le nom de la variable
     */
    @Override
    public ASAExpr getExpr1() {
        return e1;
    }

    /**
     * Retourne l'expression contenant la
     * valeur à affecter dans la variable
     * @return ASAExpr valeur à affecter
     */
    @Override
    public ASAExpr getExpr2() {
        return e2;
    }

    /**
     * Méthode formalisant l'affectation 
     * d'un valeur dans une variable
     * @return valeur de la variable
     * @throws ExecutionException 
     */
    @Override
    public int evalue() throws ExecutionException {
        int r = this.e2.evalue();
        Memory.add(FunctionStack.getExecCurrentFunction(), this.e1.getVariableName(), r);
        return r;
    }

    /**
     * Representation sous forme de 
     * caractères de l'évaluation
     * @return String de l'évalution de l'affectation
     * @throws ExecutionException 
     */
    @Override
    public String getLabelExplorateur() throws ExecutionException {
        return "EGAL " + this.evalue();
    }
}
